オリジン(IIS)でCloudFront経由のアクセスを強制する方法
おはようございます、加藤です。先日下記のブログでCloudFrontを利用している際にELBへ直接アクセスさせずにIPアドレス制限する方法をご紹介しました。
この方法は、ALBがWAFに対応していないリージョンでは使用することができません。そこで、ALBでは無くオリジン(EC2)でカスタムヘッダーを読み取ってCloudFront経由以外の接続を弾いて見ました。
概要
構成
このような構成を作ります。AWS WAFでのIPアドレス制限は冒頭に紹介した前回のブログで説明済みなので省略し、CloudFront経由以外のアクセスを弾くことに注力します。
前提
- 上記の構成を構築済みである
- WebServerにはWindows Server 2016を使用し、IISがインストール済みである
全体の構築については、省略します。前回のブログを参考に構築してください。また、WebServerにLinux(Nginx)を利用される方には下記のブログが参考になります。
やってみた
URL Rewrite モジュールのインストール
Windows Server上で作業を行います。
URL Rewrite : The Official Microsoft IIS Site
上記のサイトへアクセスし、モジュールをダウンロードします。
「Install this extension」をクリックすると、ダウンロードが開始します。
インストールに特殊な作業は必要ありません、画像を参考にインストールを完了してください。
URL Rewriteの設定
healthcheck/* 以外のURLで、CloudFront経由の証明であるカスタムヘッダーがなければ 403 を返すように設定します。作業はWindows Server上で行います。
IISの管理画面からURL書き換えを開きます。
右側メニューの操作から「規則の追加...」をクリックし、「規則の追加」画面を開きます。「受信規則」の「空の規則」を選択状態にして、「OK」をクリックします。
「受信規則の編集」画面が開くのでパラメータを設定してきます。
ELBからのヘルスチェックにはカスタムヘッダーが付与されていません。その為、パス healthcheck/* についてはヘッダチェックから除外し、ELBのヘルスチェック用に使用します。
- 名前
- cloudfront
- URLの一致
-
要求されたURL 使用 パターン パターンに一致しない ワイルドカード healthcheck/*
-
- 条件
- 論理グループ化: すべて一致
-
入力 種類 パターン {HTTP_CF_PRE_SHARED_KEY} パターンに一致しない secret
- サーバー変数
- デフォルトのまま
- アクション
-
アクションの種類 状態コード 副状態コード 理由 エラーの説明 カスタム応答 403 0 Forbidden: Access is denied Unauthorized access route.
-
右側メニューの操作から「適用」をクリックして設定を完了します。
ヘルスチェックページの作成
Copy-Item -Recurse C:\inetpub\wwwroot\ C:\inetpub\temp Move-Item C:\inetpub\temp\wwwroot\ C:\inetpub\wwwroot\healthcheck
今回はデフォルトのウェルカムページをコピーして、ヘルスチェック用のページとします。PowerShellでディレクトリをコピーします。
ALBのヘルスチェック設定
ヘルスチェックの対象を healthcheck/ 配下に変更します。マネジメントコンソール上で作業します。
ターゲットグループの画面を開いて、設定を変更します。画像ではヘルスチェックの詳細設定がデフォルトから変更されていますが、今回の目的とは直接関係はありません。
CloudFrontのカスタムヘッダー設定
CloudFrontのOriginsでカスタムヘッダーを設定する。
Origin Custom Header
Header Name | Value |
---|---|
cf-pre-shared-key | secret |
動作確認
CloudFront経由でアクセス
正常にアクセスできているOK
ALBから直接アクセス
ヘルスチェックページ
正常にアクセスできているOK
その他のページ
アクセスできないOK
あとがき
ALBがAWS WAFに対応していないリージョンでのアクセス制限をやってみました。日本リージョンでは使う必要のあまりない情報ですが、誰かのお役に立てれば幸いです。
そして、このブログに協力してい頂いた大瀧さんに感謝を。
以上です❗